package com.jasonchoi.rabbitmq.manualask;

import com.jasonchoi.rabbitmq.config.DirectRabbitConfig;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * 手动ack-注解方式
 * channel.basicReject(deliveryTag, true);  拒绝消费当前消息，
 * 如果第二参数传入true，就是将数据重新丢回队列里，那么下次还会消费这消息。
 *            设置false，就是告诉服务器，我已经知道这条消息数据了，因为一些原因拒绝它，而且服务器也把这个消息丢掉就行。 下次不想再消费这条消息了。
 * channel.basicNack(deliveryTag, false, true);
 * 第一个参数依然是当前消息到的数据的唯一id;
 * 第二个参数是指是否针对多条消息；如果是true，也就是说一次性针对当前通道的消息的tagID小于当前这条消息的，都拒绝确认。
 * 第三个参数是指是否重新入列，也就是指不确认的消息是否重新丢回到队列里面去。
 *
 * 如果使用不当会导致一些每次都被你重入列的消息一直消费-入列-消费-入列这样循环，会导致消息积压。
 * @Author: JasonChoi
 * @Date: 2020/5/28 16:11
 */
@Component
@RabbitListener(queues = DirectRabbitConfig.TEST_DIRECT_QUEUE)
public class TestManualAskConsumer {
    @RabbitHandler
    public void consume(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) throws IOException {
        System.out.println("TestManualAskConsumer进行消费：" + message);
        if("0".equals(message)){
            channel.basicReject(deliveryTag, true);
            System.out.println("手动ack，重新入列");
        }else{
            channel.basicAck(deliveryTag, false);
            System.out.println("手动ack，成功");
        }
    }
}
